package demo10
// 装饰器设计模式

// 不修改原代码的基础上增加新功能

type Component interface{
	Calc() int
}

type ConcreateComponent struct{} // 基础代码

func(c *ConcreateComponent)Calc() int { return 0} // 基础方法 功能较少

// 拓展自己的方法

type WarpAddcreateComponent struct{
	Component // 源代码
	num int
}
func NewWarpAddcreateComponent(c Component, num int) *WarpAddcreateComponent{
	return &WarpAddcreateComponent{
		Component:c,
		num:num,
	}
}

func (w *WarpAddcreateComponent)Calc() int {
	// 保留 之前源代码的基础上 增加我们想要的数据num
	return w.Component.Calc() + w.num
}


type WarpMulComponent struct{
	Component // 源代码
	num int
}

func NewWarpMulComponent(c Component, num int)  *WarpMulComponent{
	return &WarpMulComponent{
		Component:c,
		num:num,
	}
}

func (w *WarpMulComponent)Calc() int {
	return w.Component.Calc() * w.num
}